package hotel;

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import com.toedter.calendar.JDateChooser;

public class FinestraPrenotazione extends JFrame implements ActionListener,
		KeyListener {
	private ImageIcon iconav = new ImageIcon("Risorse/iconav.png"),
			iconax = new ImageIcon("Risorse/iconax.png"),
			iconai = new ImageIcon("Risorse/iconai.png"),
			iconae = new ImageIcon("Risorse/iconae.png");
	GregorianCalendar gc = new GregorianCalendar();
	private JPanel pannelloPrincipale, pannelloRicerca, pannelloTabella,
			pannelloSud, pannelloPrenotazione, pannelloBottone;
	private JLabel cercaPrenotazione, disponibilita, dal, al, aNomeDi;
	private JTextField cercaPrenotazioneT, aNomeDiT;
	private MyDefaultTableModel modelPrenotazione;
	private JTable tabella;
	private String camera;
	private JScrollPane scroll;
	private JButton prenota, cancellaPrenotazione;
	private JDateChooser chooser1, chooser2;
	private MyResultSet rs = null;
	private Calendar c1, c2;
	private Date d1, d2, dalDaCancellare, alDaCancellare;
	private String dataArrivo, dataPartenza, giornoArrivo, giornoPartenza,
			meseArrivo, mesePartenza;
	private boolean disponibile = true;
	private GraficaHotel g;
	
	public FinestraPrenotazione(String camera,GraficaHotel g) {
		this.g=g;
		this.camera = camera;
		setTitle("Prenotazione Camera " + camera);
		Image immagineIc = Toolkit.getDefaultToolkit().getImage(
				"Risorse/prenotImg1.png");
		setIconImage(immagineIc);
		setVisible(true);
		setLocation(360,120);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pannelloPrincipale = new JPanel();
		pannelloPrincipale.setLayout(new BorderLayout());
		pannelloRicerca = new JPanel();
		pannelloTabella = new JPanel();
		pannelloTabella.setLayout(new BorderLayout());
		pannelloSud = new JPanel();
		pannelloSud.setLayout(new BorderLayout());
		pannelloPrenotazione = new JPanel();
		pannelloBottone = new JPanel();
		// pannelloRicerca
		cercaPrenotazione = new JLabel("Cerca Nominativo:");
		cercaPrenotazioneT = new JTextField(20);
		cercaPrenotazioneT.addKeyListener(this);
		pannelloRicerca.add(cercaPrenotazione);
		pannelloRicerca.add(cercaPrenotazioneT);
		// pannelloTabella
		modelPrenotazione = new MyDefaultTableModel();
		modelPrenotazione.addColumn("Data di arrivo");
		modelPrenotazione.addColumn("Data di partenza");
		modelPrenotazione.addColumn("Nominativo");
		tabella = new JTable(modelPrenotazione);
		try {
			aggiornaTabellaPrenotazione();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		}
		JTableHeader header1 = tabella.getTableHeader();
		header1.setReorderingAllowed(false);
		scroll = new JScrollPane(tabella);
		pannelloTabella.add(header1, BorderLayout.PAGE_START);
		pannelloTabella.add(scroll, BorderLayout.CENTER);
		// pannelloPrenotazione
		dal = new JLabel("Dal:");
		chooser1 = new JDateChooser();
		chooser2 = new JDateChooser();
		chooser1.setDateFormatString("dd/MM/yyyy");
		chooser1.setPreferredSize(new Dimension(100, 20));
		rs = g.database.querySelect("SELECT datadipartenza FROM "+g.username+".ASSOCIAZIONE where camera='"
						+ camera + "'");
		if (rs.next()) {
			chooser1.setSelectableDateRange(rs.getDate(1),
					chooser1.getMaxSelectableDate());
		} else {
			chooser1.setSelectableDateRange((Date) gc.getTime(),
					chooser1.getMaxSelectableDate());
		}
		chooser1.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent e) {
				c1 = chooser1.getCalendar();
				if ("date".equals(e.getPropertyName())) {
					c1.add(Calendar.DATE, 1);
					chooser2.setSelectableDateRange((Date) c1.getTime(),
							chooser1.getMaxSelectableDate());
					c1.add(Calendar.DATE, -1);
					if (c2 != null) {
						if (c1.after(c2)) {
							disponibile = false;
						} else if (modelPrenotazione.getRowCount() == 0) {
							disponibile = true;
						} else {
							d1 = (Date) c1.getTime();
							d2 = (Date) c2.getTime();
							disponibile = giaPrenotata(d1, d2);
						}
						// disponibile?
						if (disponibile) {
							disponibilita.setForeground(Color.GREEN);
							scriviDalAl();
						} else
							disponibilita.setForeground(Color.RED);
					}

				}
			}
		});
		al = new JLabel("Al:");
		chooser2.setDateFormatString("dd/MM/yyyy");
		chooser2.setPreferredSize(new Dimension(100, 20));
		chooser2.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent e) {
				c2 = chooser2.getCalendar();
				if ("date".equals(e.getPropertyName()) && c1 != null) {
					if (c1.after(c2)) {
						disponibile = false;
					} else if (modelPrenotazione.getRowCount() == 0) {
						disponibile = true;
					} else {
						d1 = (Date) c1.getTime();
						d2 = (Date) c2.getTime();
						disponibile = giaPrenotata(d1, d2);
					}
					// disponibile?
					if (disponibile) {
						disponibilita.setForeground(Color.GREEN);
						scriviDalAl();
					} else
						disponibilita.setForeground(Color.RED);

				}
			}
		});
		aNomeDi = new JLabel("Nominativo:");
		aNomeDiT = new JTextField(20);
		disponibilita = new JLabel("DISPONIBILITA'");
		pannelloPrenotazione.add(dal);
		pannelloPrenotazione.add(chooser1);
		pannelloPrenotazione.add(al);
		pannelloPrenotazione.add(chooser2);
		pannelloPrenotazione.add(aNomeDi);
		pannelloPrenotazione.add(aNomeDiT);
		pannelloPrenotazione.add(disponibilita);
		// pannelloBottone
		prenota = new JButton("Prenota");
		prenota.addActionListener(this);
		cancellaPrenotazione = new JButton("Cancella prenotazione");
		cancellaPrenotazione.addActionListener(this);
		pannelloBottone.add(prenota);
		pannelloBottone.add(cancellaPrenotazione);

		add(pannelloPrincipale);
		pannelloPrincipale.add(pannelloRicerca, BorderLayout.NORTH);
		pannelloPrincipale.add(pannelloTabella, BorderLayout.CENTER);
		pannelloPrincipale.add(pannelloSud, BorderLayout.SOUTH);
		pannelloSud.add(pannelloPrenotazione);
		pannelloSud.add(pannelloBottone, BorderLayout.SOUTH);
		pack();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == prenota) {
			if (disponibile) {
				if (chooser1.getCalendar() == null
						|| chooser2.getCalendar() == null) {
					JOptionPane.showMessageDialog(null,
							"Inserisci la data di prenotazione!", "Attenzione",
							JOptionPane.INFORMATION_MESSAGE, iconae);
				} else if (aNomeDiT.getText().equals("")) {
					JOptionPane.showMessageDialog(null,
							"Inserisci un nominativo!", "Attenzione",
							JOptionPane.INFORMATION_MESSAGE, iconae);
				} else {
					try {
						g.database.queryInserimento("INSERT INTO "+g.username+".PRENOTAZIONI (camera,dal,al,nominativo) VALUES ('"
										+ camera
										+ "','"
										+ dataArrivo
										+ "','"
										+ dataPartenza
										+ "','"
										+ aNomeDiT.getText() + "')");
						JOptionPane.showMessageDialog(null,
								"Prenotazione inserita con successo.",
								"Ottimo", JOptionPane.DEFAULT_OPTION, iconav);
						aggiornaTabellaPrenotazione();
						disponibile = false;
						disponibilita.setForeground(Color.RED);
					} catch (SQLException e1) {
						e1.printStackTrace();
					} catch (ClassNotFoundException e1) {
						e1.printStackTrace();
					}
				}
			} else
				JOptionPane.showMessageDialog(null,
						"La camera non e' disponibile nella data selezionata",
						"Errore", JOptionPane.ERROR_MESSAGE, iconax);
		} else if (e.getSource() == cancellaPrenotazione) {
			int[] rows1 = tabella.getSelectedRows();
			if (rows1.length < 1) {
				JOptionPane.showMessageDialog(null,
						"Nessuna prenotazione selezionata!", "Attenzione",
						JOptionPane.WARNING_MESSAGE, iconae);
				this.setVisible(true);
			} else if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(
					null, "Sicuro di voler continuare?", "Avviso",
					JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE,
					iconai)) {
				GraficaHotel.mergeSort(rows1, 0, rows1.length - 1);
				for (int i = 0; i < rows1.length; i++) {
					try {
						String s1 = (String) modelPrenotazione.getValueAt(
								rows1[i], 0);
						String s2 = (String) modelPrenotazione.getValueAt(
								rows1[i], 1);
						DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
						dalDaCancellare = new java.sql.Date(format.parse(s1)
								.getTime());
						alDaCancellare = new java.sql.Date(format.parse(s2)
								.getTime());
						if (g.database.queryInserimento("DELETE FROM "+g.username+".PRENOTAZIONI where camera='"
										+ camera
										+ "' && dal='"
										+ dalDaCancellare
										+ "' && al='"
										+ alDaCancellare + "'")==1) {
							modelPrenotazione.removeRow(rows1[i]);
						}
					} catch (ParseException e1) {
						e1.printStackTrace();
					}
				}
				try {
					aggiornaTabellaPrenotazione();
				} catch (SQLException e1) {
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					e1.printStackTrace();
				}

			}
		}
	}

	private void aggiornaTabellaPrenotazione() throws SQLException, ClassNotFoundException {
		modelPrenotazione.setRowCount(0);
		rs = g.database.querySelect("SELECT DATE_FORMAT(dal,'%d/%m/%Y'),DATE_FORMAT(al,'%d/%m/%Y'),nominativo FROM "+g.username+".PRENOTAZIONI WHERE camera='"
						+ camera
						+ "' && nominativo"
						+ " like '"
						+ cercaPrenotazioneT.getText() + "%'");
		int columnCount = 3;
		Vector<String> row;
		while (rs.next()) {
			row = new Vector<String>(columnCount);
			for (int i = 1; i <= columnCount; i++) {
				row.add(rs.getString(i));
			}
			modelPrenotazione.addRow(row);
		}
		tabella.setModel(modelPrenotazione);
	}

	private void scriviDalAl() {
		DateFormat format=new SimpleDateFormat("yyyy-MM-dd");
		dataArrivo=format.format(c1.getTime());
		dataPartenza=format.format(c2.getTime());
	}

	private boolean giaPrenotata(Date d1, Date d2) {
		rs = g.database.querySelect("SELECT dal,al FROM "+g.username+".PRENOTAZIONI where camera='"
						+ camera + "'");
		while (rs.next()) {
			if (d1.after(rs.getDate(1))
					&& d1.before(rs.getDate(2))
					|| d2.after(rs.getDate(1))
					&& d2.before(rs.getDate(2))
					|| d1.after(rs.getDate(1))
					&& d2.before(rs.getDate(2))
					|| ((d1.before(rs.getDate(1)) || d1.equals(rs
							.getDate(1))) && (d2.after(rs.getDate(2)) || d2
							.equals(rs.getDate(2))))) {
				return false;
			}
		}
		scriviDalAl();
		return true;
	}

	@Override
	public void keyPressed(KeyEvent e) {

	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getSource() == cercaPrenotazioneT) {
			try {
				aggiornaTabellaPrenotazione();
			} catch (SQLException e1) {
				e1.printStackTrace();
			} catch (ClassNotFoundException e1) {
				e1.printStackTrace();
			}
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {

	}

	class MyDefaultTableModel extends DefaultTableModel {
		private static final long serialVersionUID = 1L;

		public boolean isCellEditable(int row, int column) {
			return false;
		}
	}

}
